package persistencia.busqueda;


import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import Excepciones.ExccepcionFormeteoDeFechas;

import negocio.busqueda.Candidato;
import negocio.busqueda.SeguimientoCandidato;
import persistencia.DACBase;
import persistencia.SingletonDACBase;

public class DACSeguimiento extends DACBase {

	private List<SeguimientoCandidato> seguimientos;
	
	private CallableStatement clstm;
	private ResultSet rs;
	
	
	
	public DACSeguimiento(DACBase dacBase) {
		super(dacBase);		
	}

	public void altaSeguimiento(Candidato c) {
		
		
		try{
			
			for (SeguimientoCandidato seguimiento: c.getSeguimientosDeCandidato()) {
					
				clstm = getConn().prepareCall("{? = call save_seguimiento(?, ?, ?, ?, ?, ?, ?, ?)}");
				clstm.registerOutParameter(1,java.sql.Types.INTEGER);			
				clstm.setInt("idseguimiento",seguimiento.getIdSeguimientoCandidato());
				clstm.setInt("idtiposeguimiento",seguimiento.getTipoSeguimiento().getIdTipoSeguimiento());
				clstm.setInt("idcandidato",c.getIdCandidato());
				// pasamos la fecha al formato string que permite pasarlo a la base
				SimpleDateFormat sdformat = new SimpleDateFormat("yyyy-MM-dd");
				clstm.setString("fechaturno", sdformat.format(seguimiento.getFechaPactada()));
				clstm.setString("horaturno", seguimiento.getHoraPactada());
				clstm.setString("resultado", seguimiento.getResultado());
				clstm.setString("observacion", seguimiento.getObservacion());			
				clstm.setInt("idlugarseguimiento", seguimiento.getLugar().getIdLugarSeguimiento());
				
				clstm.execute();  
				
				
				if (seguimiento.getIdSeguimientoCandidato() == 0) {
					seguimiento.setIdSeguimientoCandidato(clstm.getInt(1));
				}
			}
			
			
			clstm.close();
	        clstm = null;
	         
	       
		}
		
		catch (SQLException ex) {
		    // handle any errors			
		    System.out.println("SQLException: " + ex.getMessage());
		    System.out.println("SQLState: " + ex.getSQLState());
		    System.out.println("VendorError: " + ex.getErrorCode());
		    System.out.println("Error en metodo altaSeguimiento_DacSeguimiento");
		}		
		
	}
	
	public List<SeguimientoCandidato> consultarSeguimientos(int idCandidato) throws ExccepcionFormeteoDeFechas {
		try {
			seguimientos =  new ArrayList<SeguimientoCandidato>();
			clstm = getConn().prepareCall("{call seguimientoConsultar(?)}");
			clstm.setInt("idcandidato", idCandidato);
			clstm.execute();
			rs = clstm.getResultSet();
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			SeguimientoCandidato sc;
			while(rs.next()) {
				sc = new SeguimientoCandidato();
				sc.setIdSeguimientoCandidato(rs.getInt("idseguimiento"));
				try {				
					sc.setFechaPactada(sdf.parse(rs.getString("fechaturno")));
					sc.setHoraPactada(rs.getString("horaturno"));
					sc.setResultado(rs.getString("resultado"));
					sc.setObservacion(rs.getString("observacion"));
				}
				catch (Exception e){
					throw new ExccepcionFormeteoDeFechas();
				}
				DACTipoSeguimiento dacTipo = new DACTipoSeguimiento(SingletonDACBase.tomarDACBase());
				DACLugarSeguimiento dacLugar =  new DACLugarSeguimiento(SingletonDACBase.tomarDACBase());
				
				sc.setTipoSeguimiento(dacTipo.consultarTipoSeguimiento(rs.getInt("idtiposeguimiento")));
				sc.setLugar(dacLugar.consultarLugarSeguimiento(rs.getInt("idlugarseguimiento")));
				
				seguimientos.add(sc);				
			}
			
			
		}
		catch (SQLException ex) {
		    // handle any errors			
		    System.out.println("SQLException: " + ex.getMessage());
		    System.out.println("SQLState: " + ex.getSQLState());
		    System.out.println("VendorError: " + ex.getErrorCode());
		    System.out.println("Error en metodo consultarSeguimiento_DacSeguimiento");
		}	
		
		
		return seguimientos;
	}

	public void eliminarSeguimientos(List<SeguimientoCandidato> segAEliminar) {
	
		try {
			for (SeguimientoCandidato candidato : segAEliminar) {
				if (candidato.getIdSeguimientoCandidato() != 0) {
					clstm = getConn().prepareCall("{ call delete_seguimiento(?) }");
					clstm.setInt("id", candidato.getIdSeguimientoCandidato());
					
					clstm.execute();
					
				}
			}
		}
		catch (SQLException ex) {
		    // handle any errors			
		    System.out.println("SQLException: " + ex.getMessage());
		    System.out.println("SQLState: " + ex.getSQLState());
		    System.out.println("VendorError: " + ex.getErrorCode());
		    System.out.println("Error en metodo eliminarSeguimientos_DacSeguimiento");
		}	
		segAEliminar = null;				
	}
	
	
}
